package com.dadonas.fluxocaixa.entrada;

import java.text.ParseException;
import java.util.Date;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.SimpleCursorAdapter.ViewBinder;
import android.widget.TextView;

import com.dadonas.fluxocaixa.R;
import com.dadonas.fluxocaixa.TotalResult;
import com.dadonas.fluxocaixa.db.DbConst;
import com.dadonas.fluxocaixa.db.DbConstEntrada;
import com.dadonas.utils.Parser;

public class EntradaListActivity extends ListActivity{
	
	private static final int ADD_ENTRADA = 0;
	private long mIdSelecionado;
	private String mNomeSelecionado;
	private String mDescricaoSelecionado;
	private String mDataSelecionado;
	private double mPrevistoSelecionado;
	private double mRealizadoSelecionado;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.entrada_list);
		refreshEntradas();
		registerForContextMenu(getListView());
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		
		MenuInflater inflater = new MenuInflater(this);
		inflater.inflate(R.menu.main_options_menu, menu);
		
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		case R.id.main_menu_entrada: 
			Intent intent = new Intent(getBaseContext(),EntradaActivity.class);
			startActivityForResult(intent, ADD_ENTRADA);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		
		switch (resultCode) {
		case ADD_ENTRADA: refreshEntradas(); break;
		}
		
		super.onActivityResult(requestCode, resultCode, data);
	}

	private void refreshEntradas() {
		EntradaDAO dao = new EntradaDAO(this);
        dao.openConnection();
        Cursor cursor = dao.loadAll();
        
        TotalResult total = dao.createTotal(cursor);
        TextView totalPrevisto = (TextView) findViewById(R.id.entrada_list_total_previsto);
        TextView totalRealizado = (TextView) findViewById(R.id.entrada_list_total_realizado);
        totalPrevisto.setText(Parser.formatValor(total.getPrevisto()));
        totalRealizado.setText(Parser.formatValor(total.getRealizado()));
        
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.entrada_row, cursor, 
        		new String[] {DbConstEntrada.COL_ID,DbConstEntrada.COL_NOME,DbConstEntrada.COL_DESCRICAO,DbConstEntrada.COL_DATA,DbConstEntrada.COL_PREVISTO, DbConstEntrada.COL_REALIZADO}, 
        		new int[]{R.id.entrada_row_id,R.id.entrada_row_nome,R.id.entrada_row_descricao,R.id.entrada_row_data,R.id.entrada_row_previsto,R.id.entrada_row_realizado});
        adapter.setViewBinder(new ViewBinder() {
			public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
				if (view.getId() == R.id.entrada_row_previsto || view.getId() == R.id.entrada_row_realizado){
					double valor = cursor.getDouble(columnIndex);
					((TextView) view).setText(Parser.formatValor(valor));
					return true;
				} else if (view.getId() == R.id.entrada_row_data){
					Date data;
					try {
						data = Parser.toData(cursor.getString(columnIndex),DbConst.DATE_FORMAT);
						((TextView) view).setText(Parser.formatData(data, getResources().getString(R.string.date_format)));
					} catch (ParseException e) {
						e.printStackTrace();
					}
					return true;
					
				}
				return false;
			}
		});
        setListAdapter(adapter);
        dao.closeConnection();
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		
		updateViewSelecionada(v);
		aplicarRealizado();		
	}
	
	private void updateViewSelecionada(View v){
		TextView entradaRowId = (TextView) v.findViewById(R.id.entrada_row_id);
		mIdSelecionado = Long.parseLong(entradaRowId.getText().toString());
		
		TextView entradaRowNome = (TextView) v.findViewById(R.id.entrada_row_nome);
		mNomeSelecionado = entradaRowNome.getText().toString();
		
		TextView entradaRowDescricao = (TextView) v.findViewById(R.id.entrada_row_descricao);
		mDescricaoSelecionado = entradaRowDescricao.getText().toString();
		
		TextView entradaRowData = (TextView) v.findViewById(R.id.entrada_row_data);
		mDataSelecionado = entradaRowData.getText().toString();
		
		try {
			TextView entradaRowPrevisto = (TextView) v.findViewById(R.id.entrada_row_previsto);
			mPrevistoSelecionado = Parser.toDouble(entradaRowPrevisto.getText().toString());
			
			TextView entradaRowRealizado = (TextView) v.findViewById(R.id.entrada_row_realizado);
			mRealizadoSelecionado = Parser.toDouble(entradaRowRealizado.getText().toString());
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	
	private void aplicarRealizado() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		final View viewAlteracao = layoutInflater.inflate(R.layout.alteracao_realizado,null);
		TextView realizadoAtual = (TextView) viewAlteracao.findViewById(R.id.alteracao_realizado_valor_atual);
		TextView realizado = (TextView) viewAlteracao.findViewById(R.id.alteracao_realizado_valor);
		realizadoAtual.setText(Parser.formatValor(mRealizadoSelecionado));
		realizado.setText(Parser.formatValor(mPrevistoSelecionado));
		builder.setView(viewAlteracao).setTitle(mNomeSelecionado)
		       .setCancelable(false)
		       .setPositiveButton(R.string.text_Ok, new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	  EntradaDAO dao = new EntradaDAO(EntradaListActivity.this);
		        	  dao.openConnection();
		        	  TextView realizado = (TextView) viewAlteracao.findViewById(R.id.alteracao_realizado_valor);
		        	  try {
						dao.updateRealizado(mIdSelecionado, Parser.toDouble(realizado.getText().toString()));
					} catch (ParseException e) {
						e.printStackTrace();
					}
		        	  dao.closeConnection();
		        	  refreshEntradas();
		           }
		       })
		       .setNegativeButton(R.string.text_Cancelar, new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       })
		       .create().show();
		
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
		updateViewSelecionada(info.targetView);
		
		menu.setHeaderTitle(mNomeSelecionado);
		MenuInflater contextMenu = new MenuInflater(this);
		contextMenu.inflate(R.menu.entrada_context_menu, menu);		
	}
	
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		switch (item.getItemId()){
		case R.id.entrada_menu_detalhes: exibirDetalhesEntrada(); return true;
		case R.id.entrada_menu_editar: editarEntrada(); return true;
		case R.id.entrada_menu_excluir: excluirEntrada(); return true;
		case R.id.entrada_menu_alterar_previsto: alterarPrevisto(); return true;
		case R.id.entrada_menu_aplicar_realizado: aplicarRealizado(); return true;
		}
		
		return super.onContextItemSelected(item);
	}

	private void alterarPrevisto() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		final View viewAlteracao = layoutInflater.inflate(R.layout.alteracao_previsto,null);
		TextView previstoAtual = (TextView) viewAlteracao.findViewById(R.id.alteracao_previsto_valor_atual);
		previstoAtual.setText(Parser.formatValor(mPrevistoSelecionado));
		builder.setView(viewAlteracao).setTitle(mNomeSelecionado)
		       .setCancelable(false)
		       .setPositiveButton(R.string.text_Ok, new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	  EntradaDAO dao = new EntradaDAO(EntradaListActivity.this);
		        	  dao.openConnection();
		        	  TextView previsto = (TextView) viewAlteracao.findViewById(R.id.alteracao_previsto_valor);
		        	  try {
						dao.updatePrevisto(mIdSelecionado, Parser.toDouble(previsto.getText().toString()));
					} catch (ParseException e) {
						e.printStackTrace();
					}
		        	  dao.closeConnection();
		        	  refreshEntradas();
		           }
		       })
		       .setNegativeButton(R.string.text_Cancelar, new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       })
		       .create().show();
			
	}

	private void excluirEntrada() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(getResources().getString(R.string.text_Exclusao_Entrada))
			   .setMessage(getResources().getString(R.string.message_Exclusao_Entrada) + " " + mNomeSelecionado + "?")
			   .setCancelable(false)
			   .setPositiveButton(R.string.text_Sim, new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	  EntradaDAO dao = new EntradaDAO(EntradaListActivity.this);
		        	  dao.openConnection();
		        	  dao.delete(mIdSelecionado);
		        	  dao.closeConnection();
		        	  refreshEntradas();
		           }
		       })
		       .setNegativeButton(R.string.text_Nao, null)
		       .create().show();
	}

	private void editarEntrada() {
		Intent intent = new Intent(this,EntradaActivity.class);
		intent.putExtra("id", mIdSelecionado);
		startActivityForResult(intent, ADD_ENTRADA);		
	}

	private void exibirDetalhesEntrada() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		final View viewAlteracao = layoutInflater.inflate(R.layout.entrada_detalhes,null);
		TextView descricao = (TextView) viewAlteracao.findViewById(R.id.entrada_detalhes_descricao);
		if (TextUtils.isEmpty(mDescricaoSelecionado)){
			descricao.setText(getResources().getString(R.string.text_Sem_Descricao));
		} else{
			descricao.setText(mDescricaoSelecionado);
		}
		TextView data = (TextView) viewAlteracao.findViewById(R.id.entrada_detalhes_data);
		data.setText(mDataSelecionado);
		TextView previsto = (TextView) viewAlteracao.findViewById(R.id.entrada_detalhes_previsto);
		previsto.setText(Parser.formatValor(mPrevistoSelecionado));
		TextView realizado = (TextView) viewAlteracao.findViewById(R.id.entrada_detalhes_realizado);
		realizado.setText(Parser.formatValor(mRealizadoSelecionado));

		builder.setView(viewAlteracao).setTitle(mNomeSelecionado)
		       .setPositiveButton(R.string.text_Ok, null)
		       .create().show();		
	}
	
}
